//
//  Status.swift
//  01-微博项目搭建
//
//  Created by Adolph on 15/5/18.
//  Copyright (c) 2015年 Adolph. All rights reserved.
//

import UIKit
import Alamofire
import SDWebImage
private let WB_HOME_LINE_URL = "https://api.weibo.com/2/statuses/friends_timeline.json"

class Status: NSObject {
   ///微博创建时间
    var created_at: String?
    ///微博ID
    var id: Int = 0
    ///微博的正文
    var text: String?
    ///微博的来源
    var source: String?
    
    ///用户数据
    var user: User?
    ///转发微博数据
    var retweeted_status: Status?
    
    /// 小图片的 URL 数组
    var imageURLs: [NSURL]?
    ///大图片的 URL 数组
    var largePicURLs: [NSURL]?
    
    ///配图数组
    var pic_urls: [[String: String]]? {
        didSet {
          //实例化数组
          imageURLs = [NSURL]()
          largePicURLs = [NSURL]()
            for dict in pic_urls! {
                if let url = dict["thumbnail_pic"] {
                    //小图和大图的url差别，就是这两个字段换一下.
                 let largeString = (url as NSString).stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                    imageURLs?.append(NSURL(string: url)!)
                    largePicURLs?.append(NSURL(string: largeString)!)
                }
            }
        }
    
    }
    // 如果是转发的微博，原创微博没有配图
    // 定义一个计算型属性，如果是原创微博，返回原创微博的图片 URL
    // 如果是转发微博，返回转发微博的图片 URL
    var pictureURLs: [NSURL]? {
     //判断是否是转发微博
        if retweeted_status != nil {
          return retweeted_status?.imageURLs
        } else {
           return imageURLs
         }
    }
    
    /// 大图的计算属性
    var picSelectURLs: [NSURL]? {
        if retweeted_status != nil {
          return retweeted_status?.largePicURLs
         } else {
          return largePicURLs
        }
    }
    ///数组的属性
    static let properties = ["created_at", "id", "text", "source", "pic_urls"]
    /**
    加载微博数据
    since_id(后加)   若指定此参数，则返回ID比since_id大的微博，默认是0
    max_id           若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    ///加载微博数据
    class func loadStatus(#since_id: Int, max_id: Int, completion:(statuses: [Status]?)->()) {
        // 定义数组时，如果没有指定类型，数组内部的类型是自动推断的 [String: String]
        var params = ["access_token": sharedUserAccount!.access_token]
        
        if since_id > 0 {
            params["since_id"] = "\(since_id)"

        }else if max_id > 0 {
            // 为了外面的调用方便，加载数据的时候，可以提前过滤掉 max_id
          params["max_id"] = "\(max_id - 1)"
        }
        
    
        NetWorkTool.requestJSON(.GET, URlString: WB_HOME_LINE_URL, parameters: params) { (JSON) -> () in
            if JSON != nil {
                // 提取 statuses key 对应的数组
                if let array = (JSON as! NSDictionary)["statuses"] as? [[String: AnyObject]] {
                    
                    let result = self.statuses(array)
                    
                    self.cacheStatusImage(result, completion: completion)
                    
                    return
                }
            }
            completion(statuses: nil)
        }
    }
    ///缓存所有图片
    private class func cacheStatusImage(statuses: [Status]?, completion:(statuses: [Status]?) -> ()) {
        if statuses == nil {
          return
        }
        // 建立一个 dispatch_group，可以监听一组异步任务完成后，统一得到通知
        let group = dispatch_group_create()
        
//        //遍历微博数据数组
        for s in statuses as [Status]! {
          //没有图片继续缓存
            if s.pictureURLs == nil {
               return
            }
            for url in s.pictureURLs! {
                // downloadImageWithURL 本身会下载图片，并且完成缓存
                // 回调参数，通常是有 UI 交互才会使用的
                //1> 进入群组
                dispatch_group_enter(group)
               SDWebImageManager.sharedManager().downloadImageWithURL(url, options: nil, progress: nil, completed: { (_, _, _, _,_) -> Void in
                    //离开群组，一定要放在 block的最后一句，表示异步真正执行完成
                    dispatch_group_leave(group)
                })
                
            }
        }
        // 3监听群组调度
        dispatch_group_notify(group,dispatch_get_main_queue()) { () -> Void in
            println("图片缓存完成 + 加载数据 \(NSHomeDirectory())")
            //执行回调
            completion(statuses: statuses)
        }
    
    }
    
    /// 将字典数组转换成 微博 数组
    private class func statuses(array: [[String: AnyObject]]) -> [Status]? {
        if array.count == 0 {
           return nil
        }
        //实例一个可变数组
        var arrayM = [Status]()
        for dict in array {
            arrayM.append(Status(dict: dict))
        }
        return arrayM
    }
    ///字典转模型
    //init函数不用写return
    init(dict: [String: AnyObject]) {
        super.init()
        for key in Status.properties {
            
            if (dict[key] != nil) {
               // 在 swift 中，如果在 构造函数中使用 KVC，需要先 super.init，确保对象被实例化
                setValue(dict[key], forKey: key)
            }
        
        }
       // 单独处理一下 user
        if dict["user"] != nil {
            user = User(dict: dict["user"] as! [String: AnyObject])
        }
      // 单独处理转发微博
        if dict["retweeted_status"] != nil {
            retweeted_status = Status(dict: dict["retweeted_status"] as! [String: AnyObject])
        }
    }
}
